/*
 Classe para gestão do escalamento de tamanho de fontes e dimensões de imagens
 dependente da classe Assets.js do MooTools More.

 Nota: Código parcialmente baseado no script original S5 de Eric Meyer e amigos.
*/
Scale = new Class({

  // declara tamanho da fonte básica adicionando regra CSS ao elemento 'body'
  fontSize: function(value) {
    $(document.body).setStyle('font-size', value);
  },

  // altera tamanhos de fontes conforme fator escala
  fontScale: function() {
    var vScale = 22;  // ambos levam a 32 (após arredondamento) em 1024x768
    var hScale = 32;  // talvez possa auto-calcular baseado em valor temático
    // obtêm dimensões da janela cliente
    var size = window.getSize();
    // calcula o novo tamanho de fonte básica usando o fator escala
    var newSize = (Math.min((size.y / vScale), (size.x / hScale)) * this.scale).round();
    // efetiva o novo tamanho de fonte básica
    this.fontSize(/* [newSize, 'px'].join('') */newSize);
  },

  // altera dimensões das imagens disponíveis conforme fator escala
  scaleImages: function() {
    this.container.getElements('img').each(
      function(img) {
        img.width  = (img.retrieve('ww') * this.scale).round();
        img.height = (img.retrieve('hh') * this.scale).round();
      }, this);
  },

  // executa escalamento de fontes e imagens
  scaleAll: function() {
    this.fontScale();
    this.scaleImages();
  },

  // incrementa/decrementa fator escala e o aplica se possível
  chgScale: function(isToDecrease) {
    var prev = this.scale;
    this.scale = (this.scale + (isToDecrease ? -.005 : .005)).limit(.5, 1.5);
    if (this.scale != prev) this.scaleAll();
  },

  // tenta preservar fator escala
  preserve: function() {
    if (this.cookiesAllowed) {
      Cookie.write('scale', this.scale, {
            domain: window.location.hostname,
              path: window.location.pathname,
          duration: 7
        });
    }
  },

  initialize: function(container) {
    // preserva status da permissão de uso de cookies dado que por default
    // algumas marcas de navegador não aceitam uso sob protocolo "file:"
    this.cookiesAllowed = (window.location.protocol == 'http:') || !(Browser.opera /* || Browser.chrome */);
    // tenta obter valor do fator escala da sessão anterior
    var c = this.cookiesAllowed ? Cookie.read('scale') : null;
    // declara o valor do fator escala como possível
    this.scale = (c && !isNaN(c)) ? c.toFloat().round(3) : 1;
    // executa escalamento inicial de fontes
    this.fontScale();
    // declara o elemento container das imagens a escalar
    this.container = $(container || document.body);
    // obtêm a coleção de elementos imagem
    c = this.container.getElements('img');
    // checa se há imagens disponíveis
    if (c.length) {
      var self = this, images = [];
      c.each( function(img) { images.push(img.src) } );
      // pré-carregamento das imagens :: WebKit assinchronous load workaround
      Asset.images(images, {
          onComplete: function() {
            // preserva dimensões originais das imagens
            c.each(
              function(img) {
                img.store('ww', img.width);
                img.store('hh', img.height);
              });
            // se necessário executa escalamento inicial das imagens
            if (self.scale != 1) self.scaleImages();
          }
        });
    } else {
      // simplifica o escalamento geral
      this.scaleAll = this.fontScale;
    }
  }
});